home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / mint / mint110s.zoo / main.c < prev    next >
C/C++ Source or Header  |  1994-02-11  |  41KB  |  1,548 lines

  1. /*
  2. Copyright 1990,1991,1992 Eric R. Smith.
  3. Copyright 1992,1993,1994 Atari Corporation.
  4. All rights reserved.
  5. */
  6.  
  7. #include "mint.h"
  8. #include "version.h"
  9. #include "cookie.h"
  10. #include "xbra.h"
  11.  
  12. /* the kernel's stack size */
  13. #define STACK    8*1024L
  14.  
  15. /* if the user is holding down the magic shift key, we ask before booting */
  16. #define MAGIC_SHIFT 0x2        /* left shift */
  17.  
  18. /* magic number to show that we have captured the reset vector */
  19. #define RES_MAGIC 0x31415926L
  20.  
  21. static void xbra_install P_((xbra_vec *, long, long ARGS_ON_STACK (*)()));
  22. static void init_intr P_((void));
  23. static long getmch P_((void));
  24. static void do_line P_((char *));
  25. static void do_file P_((int));
  26. static void shutmedown P_((PROC *));
  27. void shutdown P_((void));
  28. static void doset P_((char *,char *));
  29. static long ARGS_ON_STACK mint_criticerr P_((long));
  30. static void ARGS_ON_STACK do_exec_os P_((register long basepage));
  31.  
  32. static int gem_active;    /* 0 if AES has not started, nonzero otherwise */
  33.  
  34. #define EXEC_OS 0x4feL
  35. static int  check_for_gem P_((void));
  36. static void run_auto_prgs P_((void));
  37.  
  38. #ifdef LATTICE
  39. /*
  40.  * AGK: this is witchcraft to completely replace the startup code for
  41.  * Lattice; doing so saves around 10K on the final binary and pulls only
  42.  * long division & multitplication from the library (and not even those
  43.  * if you compile for native '030). The drawback of this code is it
  44.  * passes no environment or command line whatsoever. Since I always
  45.  * set MiNT options & environment in 'mint.cnf' this is not a personal
  46.  * downer, however at some point in the future we ought to have a kernel
  47.  * parseargs() like call which sets these things up.
  48.  */ 
  49. BASEPAGE *_base;
  50.  
  51. static void
  52. start(BASEPAGE *bp)
  53. {
  54.     long shrinklen;
  55.     
  56.     _base = bp;
  57.     shrinklen = bp->p_tlen + bp->p_dlen + bp->p_blen + STACK + 0x100;
  58.     if (bp->p_lowtpa + shrinklen <= bp->p_hitpa) {
  59.         static char null[1] = {""};
  60.         static char *argv[2] = {null, NULL};
  61.         extern __builtin_putreg P_((int, long));    /* totally bogus */
  62.  
  63.         __builtin_putreg(15, bp->p_lowtpa + shrinklen);
  64.         Mshrink((void *)bp->p_lowtpa, shrinklen);
  65.         main(1, argv);
  66.     }
  67.     Pterm(ENSMEM);
  68. }
  69. #endif
  70.  
  71. #if defined(__GNUC__) || defined(__MINT__)
  72. long _stksize = STACK;
  73. #ifndef PROFILING
  74. #include <minimal.h>
  75. #endif
  76. #endif
  77.  
  78. int curs_off = 0;    /* set if we should turn the cursor off when exiting */
  79. int mint_errno = 0;    /* error return from open and creat filesystem calls */
  80.  
  81. /*
  82.  * AGK: for proper co-processors we must consider saving their context.
  83.  * This variable when non-zero indicates that the BIOS considers a true
  84.  * coprocessor to be present. We use this variable in the context switch
  85.  * code to decide whether to attempt an FPU context save.
  86.  */
  87. short fpu = 0;
  88.  
  89. /*
  90.  * "mch" holds what kind of machine we are running on
  91.  */
  92. long mch = 0;
  93.  
  94. /*
  95.  * "screen_boundary+1" tells us how screens must be positioned
  96.  * (to a 256 byte boundary on STs, a 16 byte boundary on other
  97.  * machines; actually, 16 bytes is conservative, 4 is probably
  98.  * OK, but it doesn't hurt to be cautious). The +1 is because
  99.  * we're using this as a mask in the ROUND() macro in mem.h.
  100.  */
  101. int screen_boundary = 255;
  102.  
  103. /*
  104.  * variable holds processor type
  105.  */
  106. long mcpu = 0;
  107.  
  108. /*
  109.  * variable holds language preference
  110.  */
  111. int gl_lang = -1;
  112.  
  113. /*
  114.  * variable set if someone has already installed an flk cookie
  115.  */
  116. int flk = 0;
  117.  
  118. /*
  119.  * variable set to 1 if the _VDO cookie indicates Falcon style video
  120.  */
  121. int FalconVideo;
  122.  
  123. /* program to run at startup */
  124. #ifdef MULTITOS
  125. static int init_is_gem = 1;    /* set to 1 if init_prg is GEM */
  126. #else
  127. static int init_is_gem = 0;    /* set to 1 if init_prg is GEM */
  128. #endif
  129. static const char *init_prg = 0;
  130.  
  131. /* note: init_tail is also used as a temporary stack for resets in
  132.  * intr.spp
  133.  */
  134. char init_tail[256];
  135.  
  136. /* initial environment for that program */
  137. static char *init_env = 0;
  138. /* temporary pointer into that environment for setenv */
  139. static char *env_ptr;
  140. /* length of the environment */
  141. static long env_len;
  142.  
  143. /* GEMDOS pointer to current basepage */
  144. BASEPAGE **tosbp;
  145.  
  146. /* pointer to the BIOS keyboard shift variable */
  147. extern char *kbshft;    /* see bios.c */
  148.  
  149. /* version of TOS we're running over */
  150. int tosvers;
  151.  
  152. /* structures for keyboard/MIDI interrupt vectors */
  153. KBDVEC *syskey, oldkey;
  154. xbra_vec old_ikbd;            /* old ikbd vector */
  155.  
  156. /* values the user sees for the DOS, BIOS, and XBIOS vectors */
  157. long save_dos, save_bios, save_xbios;
  158.  
  159. /* values for original system vectors */
  160. xbra_vec old_dos, old_bios, old_xbios, old_timer, old_vbl, old_5ms;
  161. xbra_vec old_criticerr;
  162. xbra_vec old_execos;
  163.  
  164. long old_term;
  165.  
  166. xbra_vec old_resvec;    /* old reset vector */
  167. long old_resval;    /* old reset validation */
  168.  
  169. #ifdef EXCEPTION_SIGS
  170. /* bus error, address error, illegal instruction, etc. vectors */
  171. xbra_vec old_bus, old_addr, old_ill, old_divzero, old_trace, old_priv;
  172. xbra_vec old_linef, old_chk, old_trapv, old_mmuconf, old_format, old_cpv;
  173. xbra_vec old_uninit, old_spurious, old_fpcp[7], old_pmmuill, old_pmmuacc;
  174. #endif
  175.  
  176. /* BIOS disk vectors */
  177. xbra_vec old_mediach, old_getbpb, old_rwabs;
  178.  
  179. /* BIOS drive map */
  180. long olddrvs;
  181.  
  182. extern Func bios_tab[], dos_tab[];
  183.  
  184. /* kernel info that is passed to loaded file systems and device drivers */
  185.  
  186. struct kerinfo kernelinfo = {
  187.     MAJ_VERSION, MIN_VERSION,
  188.     DEFAULT_MODE, 0,
  189.     bios_tab, dos_tab,
  190.     changedrv,
  191.     Trace, Debug, ALERT, FATAL,
  192.     kmalloc, kfree, umalloc, ufree,
  193.     strnicmp, stricmp, strlwr, strupr, ksprintf,
  194.     ms_time, unixtim, dostim,
  195.     nap, sleep, wake, wakeselect,
  196.     denyshare, denylock, addtimeout, canceltimeout
  197. };
  198.  
  199. /* table of processor frame sizes in _words_ (not used on MC68000) */
  200. unsigned char framesizes[16] = {
  201. /*0*/    0,    /* MC68010/M68020/M68030/M68040 short */
  202. /*1*/    0,    /* M68020/M68030/M68040 throwaway */
  203. /*2*/    2,    /* M68020/M68030/M68040 instruction error */
  204. /*3*/    2,    /* M68040 floating point post instruction */
  205. /*4*/    3,    /* MC68LC040/MC68EC040 unimplemented floating point instruction */
  206. /*5*/    0,    /* NOTUSED */
  207. /*6*/    0,    /* NOTUSED */
  208. /*7*/    26,    /* M68040 access error */    
  209. /*8*/    25,    /* MC68010 long */    
  210. /*9*/    6,    /* M68020/M68030 mid instruction */
  211. /*A*/    12,    /* M68020/M68030 short bus cycle */
  212. /*B*/    42,    /* M68020/M68030 long bus cycle */
  213. /*C*/    8,    /* CPU32 bus error */
  214. /*D*/    0,    /* NOTUSED */
  215. /*E*/    0,    /* NOTUSED */
  216. /*F*/    13    /* 68070 and 9xC1xx microcontroller address error */
  217. };
  218.  
  219. /* TOS and MiNT cookie jars, respectively. See the comments and code 
  220.  * after main() for further details
  221.  */
  222.  
  223. COOKIE *oldcookie, *newcookie;
  224.  
  225. /*
  226.  * install a new vector for address "addr", using the XBRA protocol.
  227.  * must run in supervisor mode!
  228.  */
  229.  
  230. static void
  231. xbra_install(xv, addr, func)
  232.     xbra_vec *xv;
  233.     long addr;
  234.     long ARGS_ON_STACK (*func)();
  235. {
  236.     xv->xbra_magic = XBRA_MAGIC;
  237.     xv->xbra_id = MINT_MAGIC;
  238.     xv->jump = JMP_OPCODE;
  239.     xv->this = func;
  240.     xv->next = *((struct xbra **)addr);
  241.     *((short **)addr) = &xv->jump;
  242. }
  243.  
  244. /*
  245.  * MiNT critical error handler; all it does is to jump through
  246.  * the vector for the current process
  247.  */
  248.  
  249. static long ARGS_ON_STACK
  250. mint_criticerr(error)
  251.     long error;    /* high word is error, low is drive */
  252. {
  253.     return (*curproc->criticerr)(error);
  254. }
  255.  
  256. /*
  257.  * if we are MultiTOS, and if we are running from the AUTO folder,
  258.  * then we grab the exec_os vector and use that to start GEM; that
  259.  * way programs that expect exec_os to act a certain way will still
  260.  * work.
  261.  * NOTE: we must use Pexec instead of p_exec here, because we will
  262.  * be running in a user context (that of process 1, not process 0)
  263.  */
  264.  
  265. static void ARGS_ON_STACK
  266. do_exec_os(basepage)
  267.     register long basepage;
  268. {
  269.     register long r;
  270.  
  271. /* if the user didn't specify a startup program, jump to the ROM */
  272.     if (!init_prg) {
  273.         register void ARGS_ON_STACK (*f) P_((long));
  274.         f = (void ARGS_ON_STACK (*) P_((long))) old_execos.next;
  275.         (*f)(basepage);
  276.         Pterm0();
  277.     } else {        
  278.  
  279. /* we have to set a7 to point to lower in our TPA; otherwise we would
  280.  * bus error right after the Mshrink call!
  281.  */
  282.         setstack(basepage+500L);
  283. #if defined(__TURBOC__) && !defined(__MINT__)
  284.         Mshrink(0, (void *